带限定词的名字

  因为名字空间是作用域,所以普通的作用域规则也对名字空间成立。因此,如果一个名字先前已在本名字空间里或者其外围作用域里声明过,它就可以直接使用了,不必再进一步为它操心。也可以使用来自另一个名字空间的名字,但需要用该名字所属的名字空间作为限定词。例如,

    double Parser::term(bool get)        // 请注意Parser::限定词
    {
        double left = prim(get);         // 不需要限定词

        for(;;)
            switch(Lexer::curr_tok) {    // 注意Lexer::限定词
            case Lexer::MUL:             // 注意Lexer::限定词
                left *= prim(true);      // 不需要限定词
            // ...
            }
        // ...
    }

第一行的Parser::限定词是必需的,用以说明这个term()就是在Parser里所声明的那一个,而不是别的什么不相干的全局函数。由于term()是Parser的成员,因此就不需要再为prim()使用限定词了。但是,如果没写Lexer限定词,curr_tok将会被认为是没有声明的,因为名字空间Lexer的成员在名字空间Parser里都不处在作用域之中。

🔚